## Описание
В рамках этого репозитория реализован пример обращения к удостоверяющему центру (УЦ) CryptoPro по двухстороннему ГОСТ TLS соединению. 
Код написан на языке Kotlin под JVM 17. Используется криптопровайдер CryptoPro CSP 5.0.13000

<details><summary>ГОСТ TLS</summary> 
это российский стандарт шифрования, разработанный для обеспечения безопасности интернет-соединений. Он основан на международном стандарте TLS (Transport Layer Security), но использует российские криптографические алгоритмы, такие как ГОСТ 28147-89 и ГОСТ Р 34.10-2012. ГОСТ TLS обеспечивает конфиденциальность, целостность и аутентификацию данных, передаваемых по сети, и используется в различных областях, включая электронное правительство, банковскую сферу и другие секторы, где требуется высокий уровень защиты информации.
</details>
<details><summary>CryptoPro Удостоверяющий Центр</summary> 
это ключевой компонент инфраструктуры открытых ключей (PKI), предоставляющий услуги по выпуску и управлению цифровыми сертификатами. УЦ КриптоПро обеспечивает создание и проверку электронной подписи, подтверждает подлинность пользователей и защищает целостность данных. Он используется в различных сферах, где требуется юридически значимый электронный документооборот, включая государственные органы, коммерческие организации и частных лиц. КриптоПро УЦ поддерживает российские криптографические стандарты, такие как ГОСТ Р 34.10-2012, и интегрируется с различными программными продуктами для работы с электронной подписью.
</details>
<details><summary>CryptoPro JCP</summary>
это программный компонент, предоставляющий Java-приложениям доступ к российским криптографическим алгоритмам. Он позволяет разработчикам интегрировать функции шифрования, электронной подписи и хэширования в свои Java-приложения, используя стандарты ГОСТ. КриптоПро JCP совместим с различными операционными системами и аппаратными платформами, что обеспечивает кроссплатформенную поддержку криптографических функций.
</details>

## Подготовка среды
1. Нужно установить набор библиотек в папку `./libs` из CryptoPro JCSP с официального сайта (часто версии несовместимы с CSP) 
2. Установить корневой сертификат УЦ в CryptoPro CSP "Сертификаты > Доверенные корневые центры сертификации"
3. Установить клиентский сертификат в CryptoPro CSP "Сертификаты > Личное"
4. Экспортировать ключи в CryptoPro CSP "Сертификаты > Личное > {Выбрать нужный сертификат}" > Экспортировать ключи
   (в формате .PFX, с цепочкой сертификатов)
5. Указать в `src/main/resources/gost-tls-client.properties` правильный путь к `.pfx`, указанный ранее пароль и `url` для вызова в УЦ

## Отладка
Иногда не получается подключиться к УЦ, возможные причины:
1. Сертификаты зашифрованы другим алгоритмом
2. Несовместимость версий CryptoPro JCSP и CSP
3. Несовместимость версий CryptoPro JCSP и JVM
4. `JCP` добавляется в Security Providers до `JCSP`
5. Параметр `com.sun.security.enableCRLDP` в состоянии `false`

Чтобы упростить отладку, рекомендую зайти в один из файлов JRE, отвечающий за логирование
и выставить значение `ALL` для логгеров при помощи команды.
```shell
echo \
"java.util.logging.ConsoleHandler.level=ALL
ru.CryptoPro.JCP.tools.JCPLogger.level=ALL
ru.CryptoPro.JCSP.JCSPLogger.level=ALL
ru.CryptoPro.JCSP.CAPILogger.level=ALL" \
>> $JAVA_HOME/conf/logging.properties
```